package com.zpself.module.算法练习.String;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*  给定仅有小写字母组成的字符串数组 A，返回列表中的每个字符串中都显示的全部字符（包括重复字符）组成的列表。
 *  例如，如果一个字符在每个字符串中出现 3 次，但不是 4 次，则需要在最终答案中包含该字符 3 次。
 * 你可以按任意顺序返回答案。
 * 
 * 示例 1：
 * 输入：["bella","label","roller"]
 * 输出：["e","l","l"]
 * 
 * 示例 2：
 * 输入：["cool","lock","cook"]
 * 输出：["c","o"]
* @author  ZengPeng
* @date  2021/2/20
**/
public class 力扣_1002_查找常用字符 {
    public static void main(String[] args) {
        System.out.println(commonChars2(new String[]{"bella","label","roller"}));
        System.out.println(commonChars2(new String[]{"cool","lock","cook"}));
    }
    //使用位图方式
    private static  List<String> commonChars2(String[] A) {
        int[]  arr = new int[26];
        for (int j = 0; j < arr.length; j++)
            arr[j]=Integer.MAX_VALUE;
        int[]  hash = new int[26];
        for (String str : A) {
            for (int j = 0; j < str.length(); j++)
                hash[str.charAt(j) - 'a']++;
            for (int i = 0; i < hash.length; i++) {
                arr[i] = Math.min(hash[i],arr[i]);
                hash[i] = 0;
            }
        }
        List<String> r = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j <arr[i]; j++)
                r.add(String.valueOf((char)('a'+i)));
        }
        return r;
    }

    //20行
    //使用集合方式
    private static  List<String> commonChars(String[] A) {
        Map<Character,Integer> resultMap = new HashMap<>();
        for (int j = 0; j < A[0].length(); j++) {
            Character s1 =A[0].charAt(j);
            resultMap.put(s1,resultMap.containsKey(s1)? resultMap.get(s1)+1 :1);
        }
        Map<Character,Integer> currentMap = new HashMap<>();
        for (int i = 1; i < A.length; i++) {
            String s = A[i];
            for (int j = 0; j < s.length(); j++) {
                Character s1 =s.charAt(j);
                currentMap.put(s1,currentMap.containsKey(s1)? currentMap.get(s1)+1 :1);
            }
            for (Character character : resultMap.keySet()) {
                if(currentMap.containsKey(character))
                    resultMap.put(character,Math.min(currentMap.get(character),resultMap.get(character)));
                else
                    resultMap.put(character,0);
            }
            currentMap.clear();
        }
        List<String> r = new ArrayList<>();
        for (Map.Entry<Character, Integer> entry : resultMap.entrySet()) {
            if(entry.getValue()>0){
                for (int i = 0; i < entry.getValue(); i++)
                    r.add(String.valueOf(entry.getKey()));
            }
        }
        return r;
    }//65-36 =30
}